#include "World.h"
#include <iostream>
#include <algorithm>
#include <iterator>

using namespace misaka;

std::list<RenderableElement> World::_elements;

ElementID World::insert(RenderableElement elem)
{
    // 找到第一个比要插入的元素小的元素，插入到这个元素前面
    auto it = std::find_if(World::_elements.begin(),
                           World::_elements.end(),
                           [&elem](RenderableElement lhs)
    {
        return elem > lhs;
    });
    it = World::_elements.insert(it, elem);

    /* 坑爹的List_Iterator */
    ElementID ret = 0;

    for(; --it != World::_elements.end(); ++ret);

    return ret;
}

RenderableElement
World::getElement(const ElementID& id)
{
    auto it = World::_elements.begin();

    for(ElementID i = 0; i < id; ++i)
    {
        ++it;
    }

    return *it;
}

std::vector<ElementID>
World::findElementsByTags(const std::string& tags)
{
    // TODO: using c++ regex implement this method
    // 首先把参数里的tags分词。
    std::vector<std::string> targets;
    std::string s;

    for(auto c : tags)
    {
        if(c == ',')
        {
            targets.push_back(s);
            s.clear();
            continue;
        }

        s.push_back(c);
    }
    targets.push_back(s);

    // 然后查找含有全部tags的元素，记录id，返回
    std::vector<ElementID> ret;
    ElementID idx = 0;
    auto isit = [&targets](const RenderableElement & elem)
    {

        for(auto s : targets)
        {
            if(!elem.hasTag(s))
            {
                return false;
            }
        }

        return true;
    };

    for(auto elem : World::_elements)
    {
        if(isit(elem))
        {
            ret.push_back(idx);
        }

        ++idx;
    }

    // 返回含有所有指定tags 的元素
    return ret;
}

void World::remove(const ElementID& id)
{
    auto it = World::_elements.begin();

    for(ElementID i = id; i > 0; --i)
    {
        ++it;
    }

    World::_elements.erase(it);
}

